/* 
 * File:   VulnerabilidadService.h
 * Author: max
 *
 * Created on October 22, 2012, 4:58 AM
 */

#ifndef VULNERABILIDADSERVICE_H
#define	VULNERABILIDADSERVICE_H

#include <iostream>
#include <pthread.h>
#include <fstream>
#include <map>
#include <vector>
#include "server_IMensajero.h"
#include "server_IMensajeEntranteManejador.h"
#include "server_Proceso.h"
#include "common_Mutex.h"


#define OK "OK"
#define ERROR "ERROR"
#define PING "PING" 
#define GET_JOB_PART "GET­JOB­PART"
#define POSSIBLE_KEY "POSSIBLE-KEY"
#define JOB_PART_FINISHED "JOB-PART-FINISHED"

#define NO_JOB_PART "NO-JOB-PART"
#define JOB_PART "JOB-PART"
#define FIN_NOTIFICACION "\n"

using namespace std;
using namespace TP::Comunicacion;
using namespace TP::Comunicacion::Eventos;

namespace TP { namespace Servicios {

    class CriptografiaService : public IMensajeEntranteManejador {

    public:

        CriptografiaService( const string& pRutaArchivoEncriptado, const int& pLongitudClave, const int &pCapacidadClientesMaxima, ostream* pOutput);

        virtual ~CriptografiaService();
        
        void Iniciar() throw (Excepcion&);
        
        void Finalizar() throw (Excepcion&);
        
        void mensajeEntranteManejador (IMensajero* pMensajero, const string& pMensaje);
        
    private:

        void imprimirEstado();
        
        void getJobPart (IMensajero* pMensajero, vector<string> &pComando);

        void setPossibleKey (IMensajero* pMensajero, vector<string> &pComando);

        void notifyJobPartFinished (IMensajero* pMensajero, vector<string> &pComando);

        void responderEco(IMensajero* pMensajero, vector<string> &pComando);

        void calcularRangoClaves (uint32_t &claveInicial, uint32_t &claveFinal, uint32_t &numeroCliente);

        bool ipValida (const string& pIp);
        
        void ed (uint8_t *data, size_t ndata, const uint8_t *key, size_t nkey);
        
        bool esPosibleClave(const string& pClave);
        
        bool dataInterpretable (uint8_t *buffer, uint32_t pLongitud);
        
        string _rutaArchivoEncriptado;
        uint32_t _longitudClave;
        uint32_t _capacidadClientesMaxima;
        string _data;
        vector<Proceso*> _procesos;
        vector<string> _claves;
        Mutex _mutex2;
        
        ostream* _output;
    };

}}

#endif	/* VULNERABILIDADSERVICE_H */

